package demo3;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class Person {
    /*
      @Autowired 自动装配注解
      该注解作用是希望让Spring容器来对这个属性进行初始化，将其管理的一个对象设置到该属性上
      需要注意，该属性必须是Spring容器管理的一个对象。
      那么Spring容器在初始化Person时，才会将Shirt对象设置到这个属性上。建立Person与
      Shirt的依赖关系。


      如果Spring容器在自动装配时抛出异常:NoUniqueBeanDefinitionException
      说明容器找到了多个子类，他们都实现了Clothes接口，无法确定应当将哪个对象设置到这里

      解决装配冲突:
      1:确保Clothes接口的实现类只有一个被Spring容器管理
      2:可以为多个Clothes的实现类在添加@Component注解时，通过注解参数为其定义组件名
        此时这里需要让Spring进行自动装配置，再添加注解@Qualifier,来通过组件名进行装配。

        例如:当前代码@Qualifier("summer")

        Spring容器创建时扫描demo3包，发现了两个实现了Clothes接口的类:
        @Component("summer")      <----可以匹配这里@Qualifier("summer")
        public class Shirt{...}

        @Component("winter")
        public class Sweater{...}

        此时容器会将Shirt实例装配到这里

   */
    @Autowired
    @Qualifier("summer")
//    private Shirt shirt;
//    private Sweater sweater;
    private Clothes clothes;
    public void play(){
//        shirt.wear();
//        sweater.wear();
        clothes.wear();
        System.out.println("出去玩");
    }
}
